package CollectionBaseTest;

import java.util.Comparator;
import java.util.Iterator;
import java.util.TreeSet;

/*
--TreeSet  可以对Set集合中的元素进行排序。

 --底层数据结构是二叉树
   保证元素唯一性的依据 ：compareTo方法return 0

                    TreeSet排序的第一种方式，让元素自身具备比较性，
                    元素需要实现Comparable接口，覆盖compareTo方法
                    实现自身需要的排序方法

                    TreeSet的第二种排序方式。
                    当元素自身不具备比较性时，或者具备的比较性不是所需要的。这时就需要让集合自身具备比较性。
                    在集合一初始化时，就有了比较方式。TreeSet的构造函数

当两种排序都存在时，以比较器为主。

需求：
     往TreeSet集合中存储自定义对象学生。
     想按照学生的年龄进行排序

记住：排序时，当主要条件相同时，一定要判断一下次要条件。
*/
class Student  implements Comparable //该接口强制让学生具备比较性
{
     private String name;
     private int age;
     Student(String name ,int age)
     {
          this.name = name;
          this.age = age;
     }
     public int compareTo(Object obj)  //复写比较
     {
//          return 1;   //只需返回1就可保证存入取出顺序一致
          if(!(obj instanceof Student))
               throw new RuntimeException("不是学生对象");
          Student s = (Student)obj;
          if(this.age>s.age)
               return 1;
          if(this.age== s.age)
          {
               return this.name.compareTo(s.name);
          }
          return -1;
     }
     public String getName()
     {
          return name;
     }
     public int getAge()
     {
          return age;
     }

}
class  TreeSetDemo
{
     public static void main(String[] args)
     {
          TreeSet ts = new TreeSet(new MyCompare());
          ts.add(new Student("lisi",11));
          ts.add(new Student("zhansan",23));
          ts.add(new Student("wangwu",12));
          ts.add(new Student("lisi",12));
          ts.add(new Student("zhaoxin",11));
          Iterator it = ts.iterator();
          while(it.hasNext())
          {
               Student s =(Student)it.next();
               System.out.println(s.getName()+"..."+s.getAge());
          }
     }
}

class MyCompare implements Comparator
{
     public int compare(Object o1,Object o2)
     {
          Student s1 = (Student)o1;
          Student s2 = (Student)o2;

          int num = s1.getName().compareTo(s2.getName());
          if(num==0){
               return new Integer(((Student) o1).getAge()).compareTo(new Integer(((Student) o2).getAge()));
          }

          return num;
     }
}